﻿package Graficos 
{
	
	import flash.display.*;
	import flash.events.*;
	
	public class GraficoNormalBlinnPhong extends GraficoNormal {	
				
		
		private static var MULTIPLO_LUZ:Number = 10000*2;
		
		public function GraficoNormalBlinnPhong(unFlare:Flare)
		{
			super(unFlare);
		}
		
		override protected function setVectoresLuz ()
		{
			return;
		}
		
		private function saturate(aValue:Number):Number // aValue will be a [-1;1] value
		{
			if (aValue<-1)
			{
				aValue = -1;
			}
			else
			{
				if (aValue>1)
				{
					aValue = 1;
				}
			}
			aValue = 0.5*(aValue+1);
			return aValue;
		}
		
		override protected function getSombraTexturaPixel(xx:Number, yy:Number):uint
		{
			var diffuse:Number = 0;
			var normal:Punto3d = getPixelNormal(xx,yy);
			//----
			var luzPosition:Punto3d = currentFlare.position();
			var vectorLuz:Punto3d = luzPosition.restarPunto3d(this.position());
			var distancia:Number = vectorLuz.distanciaCuadrada();
			vectorLuz = vectorLuz.normalizar();
			normal = normal.normalizar();
			//----
			var i:Number = saturate(vectorLuz.dot(normal));
			//----			
			/*diffuse = i*255/distancia;
			diffuse *= MULTIPLO_LUZ;*/			
			diffuse = i*200*0;
			diffuse += 1.5*getSpecular(vectorLuz,new Punto3d(0,0,1),normal);			
			//----
			var diff255:uint = diffuse;
			if (diff255>255)
			{
				diff255 = 255;
			}
			//----
			return uint(diff255);
		}
		
		private function getSpecular (vectorLuz:Punto3d,vectorVista:Punto3d,vectorNormal:Punto3d):uint
		{
			var specular:Number = 0;
			//----
			var half:Punto3d = vectorLuz.sumarPunto3d(vectorVista);
			half = half.normalizar();
			specular = saturate(half.dot(vectorNormal));
			//specular = Math.pow(specular,10);
			var i:uint = 0;
			var resultado:Number = 1;
			for (i=0;i<10;i++)
			{
				resultado *= specular;
			}
			specular = resultado;
			//----
			var spec255:uint = specular*255;
			return spec255;
		}
		
	}
}